#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <map>

using namespace std;

struct A
{
    int _a;
    int _b;
};

class Date
{
public:
    Date(int year,int month,int day)
    {
        _year=year;
        _month=month;
        _day=day;
    }
    void Print()
    {
        cout<<_year<<endl;
        cout<<_month<<endl;
        cout<<_day<<endl;
    }
    Date(const Date& d)
    {
        _year=d._year;
        _month=d._month;
        _day=d._day;
    }
    ~Date()
    {
        _year=0;
        _month=0;
        _day=0;
    }
    Date& operator=(const Date& d)
    {
        _year=d._year;
        _month=d._month;
        _day=d._day;
        return *this;
    }
private:
    int _year;
    int _month;
    int _day;
};

void test1()
{
    int a1[]={10,20,30,40};
    int a2[3]={10};
    A a3={10,20};
    for(int i=0;i<4;i++)
    {
        cout<<a1[i]<<endl;
    }
    Date d1={2023,10,10};
    d1.Print();
    Date d2(d1);
    d2.Print();
    //{}初始化列表可以有任意多个参数
    std::vector<int> v1={1,2,3,4,5,6,7};
    //{}初始化列表必须和构造函数参数匹配
    Date d3={2025,2,3};

    map<string,int> m1={{"a",1},{"b",2},{"c",3}};  
}

void test2()
{
    int a=1;
    double b=1.1;

    decltype(a) c=10.1;//c的类型是double
    decltype(b) d=10;//d的类型是double*

    cout<<typeid(c).name()<<endl;
    cout<<typeid(d).name()<<endl;

}

// template<class ...Args>
// void Show(Args... args)
// {
//     cout<<sizeof...(args)<<endl;
// }
// void test3()
// {
//     Show();
//     Show(10);
//     Show(10,"aaaaa");
//     Show(10,"aaaaaa",1.1);

// }
template<class  T,class ...Args>
void Print(T&& x,Args&&... args)
{
	cout << x << " ";
	Print(args...);
	if (sizeof...(args) == 0)
		return;
}

template<class ...Args>
void Show(Args&&... args)
{
	cout << sizeof...(args) << endl;
	Print(args...);//编译时传递给Print()
}
void test4()
{
	Show(10, "aaaaa");
	Show(10, "aaaaaa", 1.1);

}
int main()
{
    // test1();
    test4();

    return 0;
}
